# _*_ coding: utf-8 _*_
#!/etc/bin/python

import face_recognition
import pymysql
import os
 
# 加载图像及获取人脸特征
def load_image(input_image, input_name):
    # 创建数据库连接对象
    conn = pymysql.connect(
        # 数据库的IP地址
        host="127.0.0.1",
        # 数据库用户名称
        user="root",
        # 数据库用户密码
        password="123456",
        # 数据库名称
        db="face_recognition",
        # 数据库端口名称
        port=3306,
        # 数据库的编码方式 注意是utf8
        charset="utf8"
    )
 
    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = conn.cursor()
 
    # SQL查询语句
    sql = "select * from face where name = %s "
    try:
        # 执行SQL语句
        cursor.execute(sql,input_name)
        # 获取所有记录列表
        results = cursor.fetchall()
        if results:
            print(input_name + " 已存在")
            return
    except Exception as e:
        print(e)
 
        # 关闭数据库连接
        conn.close()   
    
    print(input_name)
    # 加载本地图像文件到一个numpy ndarray类型的对象上
    image = face_recognition.load_image_file(input_image)
 
    # 返回图像中每个面的128维人脸编码
    # 图像中可能存在多张人脸，取下标为0的人脸编码，表示识别出来的最清晰的人脸
    image_face_encodings = face_recognition.face_encodings(image)

    if len(image_face_encodings) == 0:
        return
    
    # 将numpy array类型转化为列表
    encoding__array_list = image_face_encodings[0].tolist()
 
    # 将列表里的元素转化为字符串
    encoding_str_list = [str(i) for i in encoding__array_list]
 
    # 拼接列表里的字符串
    encoding_str = ','.join(encoding_str_list)
 
    # 被识别者姓名
    name = input_name
 
    # 将人脸特征编码存进数据库
    save_encoding(encoding_str, name)
 
 
# 人脸特征信息保存
def save_encoding(encoding_str, name):
    # 创建数据库连接对象
    conn = pymysql.connect(
        # 数据库的IP地址
        host="127.0.0.1",
        # 数据库用户名称
        user="root",
        # 数据库用户密码
        password="123456",
        # 数据库名称
        db="face_recognition",
        # 数据库端口名称
        port=3306,
        # 数据库的编码方式 注意是utf8
        charset="utf8"
    )
 
    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = conn.cursor()
 
    # SQL插入语句
    insert_sql = "insert into face(name,face_encoding) values(%s,%s)"
    try:
        # 执行sql语句
        cursor.execute(insert_sql, (name, encoding_str))
        # 提交到数据库执行
        conn.commit()
    except Exception as e:
        # 如果发生错误则回滚并打印错误信息
        conn.rollback()
        print(e)
 
    # 关闭游标
    cursor.close()
    # 关闭数据库连接
    conn.close()
 
 
if __name__ == '__main__':
    for root,dirs,files in os.walk(r'.\images'):
        print(root)
        for file in files:
            path = os.path.join(root,file)
            load_image(path,path)